#include "reg51.h"
#include "Driver_74HC595.h"
#include "intrins.h"
// @xxMHZ  速度无关，仅需小于74HC595极限（25MHZ）

/*
 驱动74HC595芯片
 74HC595：8位串行输入、并行输出的位移缓存器：并行输出为三态输出。
 不包含的功能：
	OE（G#）控制输出使能
*/

sfr P3M0 = 0xb2;
sfr P3M1 = 0xb1;

sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;

// 测试代码
//void main(){
//	P3M0 = 0x00;
//	P3M1 = 0x00;
//	for(;;) {
//		WriteAndFlushByte595(0x51);
//		Delay500ms();
//		WriteAndFlushByte595(0xa2);
//		Delay500ms();
//		WriteAndFlushByte595(0x54);
//		Delay500ms();
//		WriteAndFlushByte595(0xa8);
//		Delay500ms();
//	}
//}


void WriteBit595(bit b){
	SCK_PORT_595 = 0;
	DS_PORT_595 = b;
	SCK_PORT_595 = 1;
	SCK_PORT_595 = 0;
}

// 写入一位数据，并更新到储存寄存器
void WriteAndFlushBit595(bit b){
	SCK_PORT_595 = 0;
	DS_PORT_595 = b;
	SCK_PORT_595 = 1;
	SCK_PORT_595 = 0;
	RCK_PORT_595 = 0;
	RCK_PORT_595 = 1;
	RCK_PORT_595 = 0;
}

// 写入8位数据，但不更新到储存寄存器
void WriteByte595(char b){
	int i;
	for(i = 7; i >= 0; i--){
		SCK_PORT_595 = 0;
		DS_PORT_595 = (b>>i)&1;
		SCK_PORT_595 = 1;
	}
	SCK_PORT_595 = 0;
}

// 写入8位数据，并更新到储存寄存器
void WriteAndFlushByte595(char b){
	int i;
	for(i = 7; i >= 0; i--){
		SCK_PORT_595 = 0;
		DS_PORT_595 = (b>>i)&1;
		SCK_PORT_595 = 1;
	}
	RCK_PORT_595 = 0;
	RCK_PORT_595 = 1;
	RCK_PORT_595 = 0;
	SCK_PORT_595 = 0;
}

// 立即更新数据到储存寄存器（使用**AndFlush**函数时不需要）
void Flush595(){
	RCK_PORT_595 = 0;
	RCK_PORT_595 = 1;
	RCK_PORT_595 = 0;
}